package com.learning.spring.cloud.alibaba.feign.user.config;

import feign.Contract;
import feign.Util;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ClassName: FeignConfig
 * Description: Feign 配置文件
 * <p>
 * 注意：
 * 1- 该类可以不写 @Configuration ，用于 @FeignClient 的 configuration 属性指定
 * 2- 加了 @Configuration，注意是否需要放在应用程序上下文的 @ComponentScan中。如在此扫描中，则被所有的应用 @FeignClient 共享。
 * 3- 全局配置 @EnableFeignClients(defaultConfiguration = FeignConfig.class) 指定默认全局配置
 * <p>
 * Feign 自动配置：FeignAutoConfiguration
 * Feign 客户端配置：FeignClientsConfiguration 定义默认使用的编码器、解码器、契约等
 * 允许 @FeignClient 的 configuration 属性指定自定义配置，优先级高
 * <p>
 * Decoder              - feignDecoder          - ResponseEntityDecoder（SpringDecoder - HttpMessageConverters）
 * Encoder              - feignEncoder          - SpringEncoder
 * FeignLoggerFactory   - feignLoggerFactory    - DefaultFeignLoggerFactory（Slf4jLogger）
 * Contract             - feignContract         - SpringMvcContract（ConversionService - FormattingConversionService）
 * Date: 2019/6/4 16:03 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Configuration
public class FeignConfig {

    /**
     * 默认的契约是 SpringMvcContract ，可以使用Spring MVC的注解 @RequestMapping等注解
     * <p>
     * 契约改为 feign 原生的默认契约。这样就可以使用 feign 自带的注解了。
     *
     * @return
     */
    @Bean
    public Contract feignContract() {
        return new SpringMvcContract();
    }

    /**
     * 一些接口需要进行基本的认证后才能调用，可以简单配置如下：
     *
     * @return
     */
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("admin", "admin", Util.UTF_8);
    }
}
